import json
import os
from base import BASE_PATH

"""
   在 JavaScript 语言中，一切都是对象。因此，任何支持的类型都可以通过 JSON 来表示，例如字符串、数字、对象、数组等，但是对象和数组是比较特殊且常用的两种类型
   所以，一个 JSON 对象可以写为如下形式：
   [
      {
        name: "Bob",
        gender: "male",
        birthday: "1992-10-18",
      },
      {
        name: "Selina",
        gender: "female",
        birthday: "1995-10-18",
      },
   ]
   实际上 JSON 对象为 Python 中的 list 和 dict 的嵌套和组合，这里称之为 JSON 对象
"""

"""
 示例1 读取json
 JSON 库的 loads 方法将 JSON 文本字符串转为 JSON 对象
   1. 列表用索引获取 2. 字典用get方法获取
"""
str = '''
[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
'''
# print(type(str))
# json_obj = json.loads(str) # JSON文本转为 JSON对象1
# print(type(json_obj))
# print(json_obj)
# print(json_obj[1].get('name')) # Selina   推荐用get 方法获取
# print(json_obj[1]['name']) # Selina
# print(json_obj[1].get('age',100)) #100 第二个参数是默认值


"""
  示例2 从文件中读取json对象
  调用方法  loads(文本) 或者load(文件流对象)
"""
with open(BASE_PATH + '/files/data.json', mode='rt', encoding='utf-8') as file:
    # 读取文本文件
    str1 = file.read()
    # JSON文本转json对象
    json_obj = json.loads(str1)
    print(json_obj[0].get('name'))  # Bob
    # 其实也可以用load 传递文件流对象，也可以得到JSON对象
    json_obj2 = json.load(open(BASE_PATH + '/files/data.json', encoding='utf-8'))
    print(json_obj2[0].get('name'))  # Bob

"""
 示例3 json对象写入到文件   json.dumps(字符串)  json.dump(文件流)
"""
data = [{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
with open(BASE_PATH + '/files/data1.json', 'w', encoding='utf-8') as file:
    # 写入的时候设置，缩进两个tab
    # 为了输出中文，还需要指定参数 ensure_ascii 为 False
    file.write(json.dumps(data, ensure_ascii=False, indent=2))
    # dumps 也有对应的 dump 方法，它可以直接将 JSON 对象全部写入到文件中
    json.dump(data, open('data.json', 'w', encoding='utf-8'), indent=2, ensure_ascii=False)

